package com.tinchos.entidades.facultad;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

import com.tinchos.entidades.Estudiante;

public class Plan {
	
	private HashMap correlatividades = new HashMap();
	private String nombre;
	private String codigo;
	
	public Plan() {
		
	}
	
	public Plan(String nombre) {
		this();
		
		String archivoACargar = "./Data/Planes/" + nombre + ".xml"; 
		SAXBuilder builder = new SAXBuilder();
		
		Document doc = null;
		Element root = null;
		
		try {
			doc = builder.build(new FileInputStream(archivoACargar));
		} catch (JDOMException e) {
			//TODO crear excepciones
			e.printStackTrace();
			System.out.println("Error1");
		} catch (IOException e) {
			//TODO crear excepciones
			System.out.println("Error2");
		}
		if (doc == null) {
			System.out.println("null3!!"); 
			System.exit(1);
		}
		root = doc.getRootElement();
		this.nombre = root.getAttributeValue("nombre");
		this.nombre = root.getAttributeValue("codigo");
		
		List materias = root.getChildren("materia");
		
		Iterator iter = materias.iterator();
		
		while (iter.hasNext()) {
			
			Element element = (Element)iter.next();
			String codigoMateria = element.getAttributeValue("codigo");
			
			List codigosCorrelativas = new ArrayList();
			
			Iterator iter2 = element.getChildren("correlativa").iterator();
			
			while (iter2.hasNext()) {
				
				Element el = (Element) iter2.next();
				codigosCorrelativas.add(el.getAttributeValue("codigo"));
			}
			
			this.correlatividades.put(codigoMateria, codigosCorrelativas);
			
			
		}
		
		System.out.println(this.correlatividades);
		
	}
	
	
	public boolean puedoCursarMateria(Estudiante estudiante, Materia materia) {
		
		boolean puedo = true;
		
		Set correlativas = obtenerCorrelativas(materia);
		if (correlativas.isEmpty()) return puedo;
		
		Iterator iter = correlativas.iterator();
		
		while (iter.hasNext()) {
			Materia mat = (Materia) iter.next();
			if (!estudiante.tieneAprobada(mat)) {
				puedo = false;
				break;
			}
			
		}
		
		return puedo;
		
		
	}
	
	public Set obtenerCorrelativas(Materia materia) {
		
		HashSet correlativas = new HashSet();
		
		if (correlatividades.containsKey(materia.getCodigo())) {
			
			List necesarias = (List) correlatividades.get(materia.getCodigo());
			
			Iterator iter = necesarias.iterator();
			
			while (iter.hasNext()) {
				
				String codigoNecesaria = (String) iter.next();
				correlativas.add(Facultad.getInstance().getMateria(codigoNecesaria));
				correlativas.addAll(obtenerCorrelativas(Facultad.getInstance().getMateria(codigoNecesaria)));
				
			}
		}
		
		return correlativas;
		
	}
	
	public List obtenerCursables(Estudiante estudiante) {
		
		return null;
		
	}
	
	public List obtenerProximasCursables(Estudiante estudiante) {
		
		return null;
		
	}
	
	public String getCodigo() {
		return codigo;
	}
	
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	
}
